 /*******************************************************************************
  * Copyright (c) 2003, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - Initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.browser;

 import java.io.File ;

 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.FileDialog;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.PlatformUI;
 /**
  *
  */
 public class BrowserDescriptorDialog extends Dialog {
     protected IBrowserDescriptorWorkingCopy browser;
     protected boolean isEdit;
     protected Button newPageCheckbox;
     protected Button clearHistoryCheckbox;
     protected Button browseButton;
     protected Text browserNameTextfield;
     protected Text browserLocationTextfield;
     protected Text browserParametersTextfield;
     private Button okButton;
     
     interface StringModifyListener {
         public void valueChanged(String s);
     }
     
     /**
      * @param parentShell
      */
     public BrowserDescriptorDialog(Shell parentShell, IBrowserDescriptorWorkingCopy browser) {
         super(parentShell);
         this.browser = browser;
         isEdit = true;
     }

     public BrowserDescriptorDialog(Shell parentShell) {
         super(parentShell);
         browser = BrowserManager.getInstance().createExternalWebBrowser();
         isEdit = false;
     }

     protected void configureShell(Shell shell) {
         super.configureShell(shell);
         
         if (isEdit)
             shell.setText(Messages.editExternalBrowser);
         else
             shell.setText(Messages.createBrowser);
     }

     protected Text createText(Composite comp, String txt, final StringModifyListener listener) {
         final Text text = new Text(comp, SWT.BORDER);
         if (txt != null)
             text.setText(txt);
         GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
         data.widthHint = 250;
         text.setLayoutData(data);
         if (listener != null)
             text.addModifyListener(new ModifyListener() {
                 public void modifyText(ModifyEvent e) {
                     listener.valueChanged(text.getText());
                 }
             });
         return text;
     }

     /* (non-Javadoc)
      * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
      */
     protected Control createDialogArea(Composite parent) {
         Font font = parent.getFont();
         Composite composite = (Composite) super.createDialogArea(parent);
         ((GridLayout)composite.getLayout()).numColumns = 3;
         composite.setFont(font);
         
         PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ContextIds.PREF_BROWSER_DIALOG);
         
         SWTUtil.createLabel(composite, Messages.name).setFont(font);
         browserNameTextfield = createText(composite, browser.getName(), new StringModifyListener() {
             public void valueChanged(String s) {
                 browser.setName(s);
                 validateFields();
             }
         });
         browserNameTextfield.setFont(font);
         
         new Label(composite, SWT.NONE);
     
         SWTUtil.createLabel(composite, Messages.location).setFont(font);
         browserLocationTextfield = createText(composite, browser.getLocation(), new StringModifyListener() {
             public void valueChanged(String s) {
                 browser.setLocation(s);
                 validateFields();
             }
         });
         browserLocationTextfield.setFont(font);
         
         browseButton = SWTUtil.createButton(composite, Messages.browse);
         browseButton.setFont(font);
         browseButton.addSelectionListener(new SelectionAdapter() {
             public void widgetSelected(SelectionEvent e) {
                 FileDialog dialog = new FileDialog(getShell(), SWT.OPEN);
                 dialog.setText(Messages.browseMessage);
                 
                 String fname = browserLocationTextfield.getText();
                 
                 dialog.setFileName(fname);
                 fname = dialog.open();
                 
                 if (fname != null)
                     browserLocationTextfield.setText(fname);
             }
         });
         
         SWTUtil.createLabel(composite, Messages.parameters).setFont(font);
         browserParametersTextfield = createText(composite, browser.getParameters(), new StringModifyListener() {
             public void valueChanged(String s) {
                 browser.setParameters(s);
             }
         });
         browserParametersTextfield.setFont(font);

         new Label(composite, SWT.NONE);
         
         new Label(composite, SWT.NONE);
         Label urlLabel = new Label(composite, SWT.NONE);
         urlLabel.setText(NLS.bind(Messages.parametersMessage, IBrowserDescriptor.URL_PARAMETER));
         urlLabel.setFont(font);
         
         return composite;
     }

     /* (non-Javadoc)
      * @see org.eclipse.jface.dialogs.Dialog#okPressed()
      */
     protected void okPressed() {
         // do simple field validation to at least ensure target directory entered is valid pathname
 try {
         File file = new File (browser.getLocation());
             if(!file.isFile()){
                 WebBrowserUtil.openError(Messages.locationInvalid);
                 return;
             }
         }
         catch(Exception e){
             WebBrowserUtil.openError(Messages.locationInvalid);
             return;
         }
         
         browser.save();
         super.okPressed();
     }
     
     private void setOKButtonEnabled(boolean curIsEnabled) {
         if (okButton == null)
             okButton = getButton(IDialogConstants.OK_ID);
         
         if (okButton != null)
             okButton.setEnabled(curIsEnabled);
     }
     
     protected Control createButtonBar(Composite parent) {
         Control buttonControl = super.createButtonBar(parent);
         validateFields();
         return buttonControl;
     }
     
     protected void validateFields() {
         boolean valid = true;
         
         String name = browserNameTextfield.getText();
         if (name == null || name.trim().length() < 1)
             valid = false;
         
         String location = browserLocationTextfield.getText();
         if (location == null || location.trim().length() < 1)
             valid = false;
         
         setOKButtonEnabled(valid);
     }
 }

